在博客 Android 插件化 – 类的动态加载源码分析 中我们从源码角度了解了类的动态加载,那么现在我们再来看一下 Small 框架中是怎么来实现类的动态加载的。
ClassLoader Dex 扩展
在 ApkBundleLauncher.loadBundle
中:
1 | public void loadBundle(Bundle bundle) { |
这里直接调用了 DexFile.loadDex
来加载 dex 文件并保存到 LoadedApk
对象的 dexFile
变量中。
把 native libraries 路径保存到 LoadedApk.libraryPath
中
然后在 ApkBundleLauncher.postSetUp()
方法中:
1 | public void postSetUp() { |
扩展 DexPathList
这里主要是调用反射扩展当前 ClassLoader 的 DexPathList 的 dexElements 变量。
1 | public static boolean expandDexPathList(ClassLoader cl, String[] dexPaths, DexFile[] dexFiles) { |
扩展 NativeLibraryDirectories
这里主要是调用反射扩展当前 ClassLoader 的 DexPathList 的 nativeLibraryDirectories 变量。
1 | public static void expandNativeLibraryDirectories(ClassLoader classLoader, List<File> libPath) { |
类的动态加载
把 ClassLoader 扩展以后,就可以在宿主apk里面正常调用插件中的类了。插件类的入口 Activity 我们还是要通过反射来调用的,启动插件Activity流程在另外一篇博客中有介绍。